#include<bits/stdc++.h>
using namespace std;
const int N=10010;
struct sp{
    float b;
    float e;
    int f;
};
struct di{
    int num,ind;
};

int cmp(di x,di y){
    return x.num<y.num;
}
int T;
int n,m,L,V;
int d,v,a,dete;
int de[N][N];
di dic[N];
sp os[N];
int ans=0;
int ans1=0;
int cnt=0;
bool fl=false;
int fig(int a,int b){
    fl=false;
    for(int k=1;k<=100010;k++){
        if(b*k>a) return k-1;
        if(b*k==a){
            fl=true;
            return k;
        }
    }
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>T;
    while(T--){
        cnt=0;
        ans1=0;
        ans=0;
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;i++){
            cin>>d>>v>>a;
            int y=cnt;
            if(a==0){
                if(v>V) os[++cnt].b=d,os[cnt].e=L,os[cnt].f=0;
            }else if(a>0){
                if(v>V) os[++cnt].b=d,os[cnt].e=L,os[cnt].f=0;
                if(v==V) os[++cnt].b=d,os[cnt].e=L,os[cnt].f=0;
                if(v<V){
                    int x=fig((V*V-v*v),(2*a));
                    if(fl==false) x++;
                    if(x<L-d) os[++cnt].b=d+x,os[cnt].e=L,os[cnt].f=0;
                }
            }else{
                if(v>V){
                    int x=fig((v*v-V*V),(2*(-a)));
                    os[++cnt].b=d,os[cnt].e=min((d+x),L),os[cnt].f=0;
                }
            }
        }
        for(int i=1;i<=m;i++){
            cin>>dete;
            dic[i].num=0;
            dic[i].ind=i;
            for(int j=1;j<=cnt;j++){
                if(os[j].b<=dete&&os[j].e>=dete){
                        de[i][++dic[i].num]=j,os[j].f++;
                        if(os[j].f==1) ans1++;
                }
            }
        }
        sort(dic+1,dic+m+1,cmp);
        for(int k=1;k<=m;k++){
            bool flag=false;
            int dict=dic[k].num,i=dic[k].ind;
            for(int j=1;j<=dic[k].num;j++){
                if(os[de[i][j]].f==1){
                    flag=true;
                    for(int z=1;z<j;z++) os[de[i][z]].f++;
                    break;
                }else os[de[i][j]].f--;

            }
            if(!flag) ans++;
        }
        cout<<ans1<<" "<<ans<<endl;
    }

    return 0;
}
